package com.hao.study.common;

import lombok.Data;

import java.io.Serializable;

/**
 * 响应消息体类，用于封装API的返回结果。
 * @param <T> 返回数据的泛型类型。
 */
@Data
public class APIResponse<T> implements Serializable {
    private int code; // 响应码
    private String msg; // 响应消息
    private T data; // 响应数据
    private String trace; // 请求追踪ID，用于问题定位
    private long timestamp; // 响应时间戳

    /**
     * 默认构造方法，初始化时间戳。
     */
    public APIResponse() {
        this.timestamp = System.currentTimeMillis();
    }

    /**
     * 构造方法，用于创建带有响应码和消息的响应体。
     * @param responseCode 响应码对象，包含响应码和消息。
     */
    public APIResponse(ResponeCode responseCode) {
        this.timestamp = System.currentTimeMillis();
        this.code = responseCode.getCode();
        this.msg = responseCode.getMsg();
    }

    /**
     * 构造方法，用于创建带有自定义消息的响应体。
     * @param responseCode 响应码对象，包含响应码和默认消息。
     * @param msg          自定义的响应消息。
     */
    public APIResponse(ResponeCode responseCode, String msg) {
        this(responseCode);
        this.msg = msg;
    }

    /**
     * 构造方法，用于创建带有响应数据的响应体。
     * @param responseCode 响应码对象，包含响应码和消息。
     * @param data         响应数据。
     */
    public APIResponse(ResponeCode responseCode, T data) {
        this(responseCode);
        this.data = data;
    }

    /**
     * 构造方法，用于创建带有响应码、自定义消息和响应数据的响应体。
     * @param responseCode 响应码对象，包含响应码和默认消息。
     * @param msg          自定义的响应消息。
     * @param data         响应数据。
     */
    public APIResponse(ResponeCode responseCode, String msg, T data) {
        this(responseCode);
        this.trace = msg;
        this.data = data;
    }

    /**
     * 转换为字符串表示，包含时间戳、响应码、消息、追踪ID和数据。
     * @return 字符串表示的响应体。
     */
    @Override
    public String toString() {
        return "APIResponse{" +
                "timestamp=" + timestamp +
                ", code=" + code +
                ", msg='" + msg + '\'' +
                ", trace='" + trace + '\'' +
                ", data=" + data +
                '}';
    }
}
